﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using Project.Core;
using Microsoft.Xna.Framework.Graphics;
using Microsoft.Xna.Framework.Audio;
namespace TLS
{
    public class Kaled : Sprite
    {
        private Game1 game;

        private float fuerzaGravedad = 0.0015f;

        public float velocidad { get; set; }
        public int puntos { get; set; }
        public int vida { get; set; }
        public double vidaActual { get; set; }
        public Animacion ACaminandoDerecha;
        public Animacion ACaminandoIzquierda;
        public Animacion AParadoDerecha;
        public Animacion AParadoIzquierda;
        public Animacion ASaltandoDerecha;
        public Animacion ASaltandoIzquierda;
        public Arma objArma { get; set; }
        public enum Estados
        {
            CAMINANDO, SALTANDO, PARADO
        }
        public Estados Estado { get; set; }
        public enum Direcciones
        {
            IZQUIERDA, DERECHA
        }
        public Direcciones Direccion { get; set; }

        protected SoundEffect SonidoDisparo { get; set; }
        public Kaled(Game1 game)
            : base(null)
        {
            this.game = game;

            //Cargamos el sonido
            SonidoDisparo = game.Content.Load<SoundEffect>("sonidos/disparo");

            objArma = new Arma(this.game);
            //Cargamos imagenes de Kaled mirando a la izquierda
            Texture2D Kaled00i = game.Content.Load<Texture2D>("sprite Kaled/detenido_l");
            Texture2D Kaled01i = game.Content.Load<Texture2D>("sprite Kaled/caminando_l01");
            Texture2D Kaled02i = game.Content.Load<Texture2D>("sprite Kaled/caminando_l02");
            Texture2D Kaled03i = game.Content.Load<Texture2D>("sprite Kaled/caminando_l03");
            Texture2D Kaled04i = game.Content.Load<Texture2D>("sprite Kaled/caminando_l04");
            Texture2D Kaled05i = game.Content.Load<Texture2D>("sprite Kaled/caminando_l05");
            Texture2D Kaled06i = game.Content.Load<Texture2D>("sprite Kaled/caminando_l06");
            Texture2D Kaled07i = game.Content.Load<Texture2D>("sprite Kaled/caminando_l07");
            Texture2D Kaled08i = game.Content.Load<Texture2D>("sprite Kaled/caminando_l08");
            Texture2D Kaled09i = game.Content.Load<Texture2D>("sprite Kaled/caminando_l09");
            Texture2D Kaled10i = game.Content.Load<Texture2D>("sprite Kaled/caminando_l10");
            //Saltando
            Texture2D Kaled11i = game.Content.Load<Texture2D>("sprite Kaled/saltando_l01");
            Texture2D Kaled12i = game.Content.Load<Texture2D>("sprite Kaled/saltando_l02");
            Texture2D Kaled13i = game.Content.Load<Texture2D>("sprite Kaled/saltando_l03");
            Texture2D Kaled14i = game.Content.Load<Texture2D>("sprite Kaled/saltando_l04");



            //Cargamos imagenes de Kaled mirando a la derecha
            Texture2D Kaled00d = game.Content.Load<Texture2D>("sprite Kaled/detenido_r");
            Texture2D Kaled01d = game.Content.Load<Texture2D>("sprite Kaled/caminando_r01");
            Texture2D Kaled02d = game.Content.Load<Texture2D>("sprite Kaled/caminando_r02");
            Texture2D Kaled03d = game.Content.Load<Texture2D>("sprite Kaled/caminando_r03");
            Texture2D Kaled04d = game.Content.Load<Texture2D>("sprite Kaled/caminando_r04");
            Texture2D Kaled05d = game.Content.Load<Texture2D>("sprite Kaled/caminando_r05");
            Texture2D Kaled06d = game.Content.Load<Texture2D>("sprite Kaled/caminando_r06");
            Texture2D Kaled07d = game.Content.Load<Texture2D>("sprite Kaled/caminando_r07");
            Texture2D Kaled08d = game.Content.Load<Texture2D>("sprite Kaled/caminando_r08");
            Texture2D Kaled09d = game.Content.Load<Texture2D>("sprite Kaled/caminando_r09");
            Texture2D Kaled10d = game.Content.Load<Texture2D>("sprite Kaled/caminando_r10");
            //Saltando
            Texture2D Kaled11d = game.Content.Load<Texture2D>("sprite Kaled/saltando_r01");
            Texture2D Kaled12d = game.Content.Load<Texture2D>("sprite Kaled/saltando_r02");
            Texture2D Kaled13d = game.Content.Load<Texture2D>("sprite Kaled/saltando_r03");
            Texture2D Kaled14d = game.Content.Load<Texture2D>("sprite Kaled/saltando_r04");

            //Animacion Kaled caminando a la izquierda
            ACaminandoIzquierda = new Animacion();
            ACaminandoIzquierda.agregarFrame(Kaled01i, 200);
            ACaminandoIzquierda.agregarFrame(Kaled02i, 200);
            ACaminandoIzquierda.agregarFrame(Kaled03i, 200);
            ACaminandoIzquierda.agregarFrame(Kaled04i, 200);
            ACaminandoIzquierda.agregarFrame(Kaled05i, 200);
            ACaminandoIzquierda.agregarFrame(Kaled06i, 200);
            ACaminandoIzquierda.agregarFrame(Kaled07i, 200);
            ACaminandoIzquierda.agregarFrame(Kaled08i, 200);
            ACaminandoIzquierda.agregarFrame(Kaled09i, 200);
            ACaminandoIzquierda.agregarFrame(Kaled10i, 200);
            //saltando
            ASaltandoIzquierda = new Animacion();
            ASaltandoIzquierda.agregarFrame(Kaled11i, 350);
            ASaltandoIzquierda.agregarFrame(Kaled12i, 350);
            ASaltandoIzquierda.agregarFrame(Kaled13i, 350);
            ASaltandoIzquierda.agregarFrame(Kaled14i, 350);
            //Animacion Kaled caminando a la derecha
            ACaminandoDerecha = new Animacion();
            ACaminandoDerecha.agregarFrame(Kaled01d, 200);
            ACaminandoDerecha.agregarFrame(Kaled02d, 200);
            ACaminandoDerecha.agregarFrame(Kaled03d, 200);
            ACaminandoDerecha.agregarFrame(Kaled04d, 200);
            ACaminandoDerecha.agregarFrame(Kaled05d, 200);
            ACaminandoDerecha.agregarFrame(Kaled06d, 200);
            ACaminandoDerecha.agregarFrame(Kaled07d, 200);
            ACaminandoDerecha.agregarFrame(Kaled08d, 200);
            ACaminandoDerecha.agregarFrame(Kaled09d, 200);
            ACaminandoDerecha.agregarFrame(Kaled10d, 200);
            //saltando
            ASaltandoDerecha = new Animacion();
            ASaltandoDerecha.agregarFrame(Kaled11d, 350);
            ASaltandoDerecha.agregarFrame(Kaled12d, 350);
            ASaltandoDerecha.agregarFrame(Kaled13d, 350);
            ASaltandoDerecha.agregarFrame(Kaled14d, 350);
            //Animacion Kaled parado a la izquierda
            AParadoIzquierda = new Animacion();
            AParadoIzquierda.agregarFrame(Kaled00i, 200);
            //Animacion Kaled parado a la derecha
            AParadoDerecha = new Animacion();
            AParadoDerecha.agregarFrame(Kaled00d, 200);

            //Animacion por defecto
            base.animacion = AParadoDerecha;
            //Velocidad de Kaled Caminando
            velocidad = 0.3f;
            this.puntos = 0;
            this.vida = 5;
            this.vidaActual = 100;
        }

        public override void actualizar(long tiempo)
        {
            switch (Direccion)
            {
                case Direcciones.IZQUIERDA:
                    this.objArma.x = this.x - this.animacion.obtenerImagen().Width - 5;
                    this.objArma.Direccion = Arma.Direcciones.IZQUIERDA;
                    switch (Estado)
                    {
                        case Estados.CAMINANDO:
                            this.objArma.Estado = Arma.Estados.CAMINANDO;
                            base.animacion = ACaminandoIzquierda;
                            break;
                        case Estados.PARADO:
                            this.objArma.Estado = Arma.Estados.PARADO;
                            base.animacion = AParadoIzquierda;
                            break;
                        case Estados.SALTANDO:
                            this.objArma.Estado = Arma.Estados.SALTANDO;
                            base.animacion = ASaltandoIzquierda;
                            break;
                    }
                    break;
                case Direcciones.DERECHA:
                    this.objArma.x = this.x + this.animacion.obtenerImagen().Width;
                    this.objArma.Direccion = Arma.Direcciones.DERECHA;
                    switch (Estado)
                    {
                        case Estados.CAMINANDO:
                            this.objArma.Estado = Arma.Estados.CAMINANDO;
                            base.animacion = ACaminandoDerecha;
                            break;
                        case Estados.PARADO:
                            this.objArma.Estado = Arma.Estados.PARADO;
                            base.animacion = AParadoDerecha;
                            break;
                        case Estados.SALTANDO:
                            this.objArma.Estado = Arma.Estados.SALTANDO;
                            base.animacion = ASaltandoDerecha;
                            break;
                    }
                    break;
            }
            base.actualizar(tiempo);
            //Gravedad
            velocidadY += fuerzaGravedad * tiempo;
            this.objArma.y = this.y;
        }

        public void saltar()
        {
            if (Estado != Estados.SALTANDO)
            {
                //Saltaa!!
                velocidadY -= 0.6f;
                Estado = Estados.SALTANDO;
            }
        }

        public void disparar()
        {
            Disparo nuevoDisparo = new Disparo(this.game);
            nuevoDisparo.y = this.y;
            if (this.Direccion == Direcciones.DERECHA)
            {
                nuevoDisparo.x = this.x + this.animacion.obtenerImagen().Width + 32;
                nuevoDisparo.y = this.y + (this.animacion.obtenerImagen().Height / 2);
                nuevoDisparo.direccion = Disparo.Direcciones.DERECHA;
            }
            else
            {
                nuevoDisparo.x = this.x - nuevoDisparo.animacion.obtenerImagen().Width - 32;
                nuevoDisparo.y = this.y + (this.animacion.obtenerImagen().Height / 2);
                nuevoDisparo.direccion = Disparo.Direcciones.IZQUIERDA;
            }
            SonidoDisparo.Play();
            escenarioActual.sprites.Add(nuevoDisparo);
        }

        public void morirBoss1(Sprite objSprite)
        {
            Boss1 objBoss1 = (Boss1)objSprite;

            if (this.vidaActual > 0)
            {
                this.vidaActual -= objBoss1.ataqueBoss1;
            }
            else if (this.vidaActual < 1)
            {
                if (vida > 0)
                {
                    this.x = this.x;
                    this.y = this.y;
                    this.vidaActual = 100;
                    this.vida--;
                    //escenarioActual.regenerarMapa();
                    //escenarioActual.sprites.Add(this.objArma);
                }
                if (vida == 0 && this.vidaActual < 0)
                {
                    this.vida = 5;
                    this.puntos = 0;
                    this.vidaActual = 100;
                    this.x = 3;
                    this.y = 25;
                    escenarioActual.regenerarMapa();
                    escenarioActual.sprites.Add(this.objArma);
                }
            }
        }

        public void morir(Sprite objSprite)
        {
            Caminante objCaminante = (Caminante)objSprite;

            if (this.vidaActual > 0)
            {
                this.vidaActual -= objCaminante.ataque;
            }
            else if (this.vidaActual < 1)
            {
                if (vida > 0)
                {
                    this.x = this.x;
                    this.y = this.y;
                    this.vidaActual = 100;
                    this.vida--;
                    //escenarioActual.regenerarMapa();
                    //escenarioActual.sprites.Add(this.objArma);
                }
                if (vida == 0 && this.vidaActual < 0)
                {
                    this.vida = 5;
                    this.puntos = 0;
                    this.vidaActual = 100;
                    this.x = 3;
                    this.y = 25;
                    escenarioActual.regenerarMapa();
                    escenarioActual.sprites.Add(this.objArma);
                }
            }
        }

        public void morirBoss2(Sprite objSprite)
        {
            Boss2 objBoss2 = (Boss2)objSprite;

            if (this.vidaActual > 0)
            {
                this.vidaActual -= objBoss2.ataqueBoss2;
            }
            else if (this.vidaActual < 1)
            {
                if (vida > 0)
                {
                    this.x = this.x;
                    this.y = this.y;
                    this.vidaActual = 100;
                    this.vida--;
                    //escenarioActual.regenerarMapa();
                    //escenarioActual.sprites.Add(this.objArma);
                }
                if (vida == 0 && this.vidaActual < 0)
                {
                    this.vida = 5;
                    this.puntos = 0;
                    this.vidaActual = 100;
                    this.x = 3;
                    this.y = 25;
                    escenarioActual.regenerarMapa();
                    escenarioActual.sprites.Add(this.objArma);
                }
            }
        }

        public void caerMapa(bool cae)
        {
            if (vida > 0 && !cae)
            {
                vida--;
                cae = true;
            }
            if (vida == 0)
            {
                this.vida = 5;
                this.vidaActual = 100;
                this.x = 3;
                this.y = 25;
                escenarioActual.regenerarMapa();
                escenarioActual.sprites.Add(this.objArma);
            }
        }

        public override void evento_ColisionVerticalTile()
        {
            //bool cae = false;
            base.evento_ColisionVerticalTile();
            if (velocidadY >= 0 && Estado == Kaled.Estados.SALTANDO)
            {
                Estado = Kaled.Estados.PARADO;
            }
            if (this.y + this.animacion.obtenerImagen().Height >= TileMap.tilesAPixels(this.escenarioActual.alto))
            {
                //this.caerMapa(cae);
                escenarioActual.regenerarMapa();
                escenarioActual.sprites.Add(this.objArma);
            }
        }

        public override void evento_ColisionVerticalSprite(Sprite objSprite)
        {
            if (objSprite is Caminante)
            {
                this.morir(objSprite);
            }
            base.evento_ColisionVerticalSprite(objSprite);
        }

        public override void evento_ColisionHorizontalSprite(Sprite objSprite)
        {
            if (objSprite is Caminante)
            {
                this.morir(objSprite);

            }
            else if (objSprite is Boss1) 
            {
                this.morirBoss1(objSprite);
            }
            else if (objSprite is Boss2)
            {
                this.morirBoss2(objSprite);
            }
           base.evento_ColisionHorizontalSprite(objSprite);
        }
    }
}
